﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo8
{
    /// <summary>
    /// 题目描述：给定一个整数数组 nums 和一个目标值 target，请你在该数组中找出和为目标值的那两个整数，并返回它们的值和数组下标。
    /// 示例：
    /// 输入：nums = [2,7,11,15], target = 9
    /// 输出：2，7     下标0,1
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            //int[] array = { 1, 4, 5, 6, 8 };
            //int target = 10;
            //int[] result = MatchSum(array, target);
            //Console.WriteLine($"和为{target}的两个元素{array[result[0]]},{array[result[1]]}为下标为({result[0]},{result[1]})");

            int[] array = { 10, 13, 1, 4, 4, 5, 6, 13, 10, 5, 5, 5, 8, 1, 1 };
            Console.WriteLine($"{string.Join(",",Destinct(array))}");
            Console.ReadKey();
        }

        static int [] Destinct(int[] nums)
        {
            if (nums.Length == 0)
                return new int[0];
            //先排序
            Array.Sort(nums);
            int i = 0, j = 1;
            //首先i指向第一个元素，j指向每二个元素
            //如果nums[i]等于nums[j], j向后移，直到nums[i]不等于nums[j]
            //则把nums[j]赋值给nums[i], 然后i向后移
            //按上步骤迭代到j到数组最后
            //结果就是0到i + 1的数组元素
            for (;j<nums.Length;j++)
            {
                if(nums[j]!=nums[i])
                {
                    i++;
                    nums[i] = nums[j];
                }
            }
            //返回最后的结果，为原数组的下标从0到i+1的元素
            int [] result =new int[i + 1];
            for (int k = 0; k < i + 1; k++)
                result[k] = nums[k];
            return result;
        }


        /// <summary>
        /// 给定一个整数数组 nums 和一个目标值 target,在该数组中找出和为目标值的那两个整数，并返回它们的值和数组下标。
        /// </summary>
        /// <param name="nums">给定的数组</param>
        /// <param name="target">和，目标值</param>
        /// <returns>满足求和结果的元素的两个下标</returns>
        static int[] MatchSum(int[] nums, int target)
        {
            for (int i = 0; i < nums.Length - 1; i++)
            {
                for (int j = i + 1; j < nums.Length; j++)
                {
                    if (nums[i] + nums[j] == target)
                        return new int[] { i, j };
                }
            }
            return new int[] { };
        }

    }
}
